<?php

namespace Admin\Controller;

use Think\Controller;

class BaseController extends Controller {

    /**
     * 模型，用于数据库查询
     * @var object  
     */
    protected $model = null;

    /**
     * 页面标题，这里统一采用单词间用_进行分隔
     * @var string
     */
    protected $page_title = '';

    /**
     * 查询条件
     * @var string
     */
    protected $query_condition = array();

    /**
     * 查询的操作
     * @var type 
     */
    protected $action = array(
        'insert' => '添加',
        'modify' => '更新'
    );

    /**
     * 所属模块（中文）
     * @var type 
     */
    protected $module;

    /**
     * 所属模块（英文）
     * @var type 
     */
    protected $module_en;

    /**
     * 初始化操作
     */
    public function _initialize() {
        $this->initMenu();
        $this->assign('module', $this->module . '管理');
        $this->assign('module_en', $this->module_en);
    }

    /**
     * 列表页
     */
    public function lists() {
        $list = $this->model->loadList($this->query_condition);
        $this->assign('list', $list);
//        dump($list);
        $this->display();
    }

    /**
     * 跳转至列表页
     */
    public function index() {
        $this->redirect('lists');
    }

    /**
     * 添加操作
     */
    public function insert($data = array()) {
        $this->iORm($data, 'insert');
    }

    /**
     * 添加操作
     */
    public function modify($data = array()) {
        $this->iORm($data, 'modify');
    }

    /**
     * 编辑页面
     */
    public function edit() {
        if (method_exists($this->model, 'fetch')) {
            $info = $this->model->fetch($this->query_condition);
        } else {
            $info = $this->model->where($this->query_condition)->find();
        }
        $this->assign($info);
        $this->display();
    }

    /**
     * 添加页面
     */
    public function add($template = 'edit') {
        $this->display($template);
    }

    /**
     * 编辑或添加操作
     * @param type $data
     * @param type $act
     */
    protected function iORm($data = array(), $act = 'insert') {
        $this->model == null && $this->model = D(CONTROLLER_NAME);
        $data = $data ? $data : I('post.');
        $res = $this->model->$act($data);
        if ($res === false) {
            $this->error($this->model->getError());
        } else {
            //如果需要传递额外的数据，则调用此方法,默认返回为空
            $extendData = $this->getExtendData($act);
            $this->success($this->action[$act] . '成功', U(CONTROLLER_NAME . '/lists'), false, $extendData);
        }
    }

    /**
     * 获取额外的数据
     * @return type
     */
    protected function getExtendData() {
        return array();
    }

    /**
     * 初始化菜单栏
     */
    protected function initMenu() {
        $this->menu_path = MODULE_NAME . DIRECTORY_SEPARATOR . CONTROLLER_NAME . DIRECTORY_SEPARATOR . ACTION_NAME;
        $this->base_menu_path = MODULE_NAME . DIRECTORY_SEPARATOR . CONTROLLER_NAME . DIRECTORY_SEPARATOR;
        $this->menuList = D('Menu')->loadList();
    }

    /**
     * 重写success方法让其支持额外的ajax数据
     * @param type $message
     * @param type $jumpUrl
     * @param type $ajax
     * @param type $extendData
     */
    protected function success($message = '', $jumpUrl = '', $ajax = false, $extendData = array()) {
        $this->dispatchJump($message, 1, $jumpUrl, $ajax, $extendData);
    }

    /**
     * 默认跳转操作 支持错误导向和正确跳转
     * 调用模板显示 默认为public目录下面的success页面
     * 提示页面为可配置 支持模板标签
     * @param string $message 提示信息
     * @param Boolean $status 状态
     * @param string $jumpUrl 页面跳转地址
     * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间
     * @access private
     * @return void
     */
    private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false, $extendData = array()) {
        if (true === $ajax || IS_AJAX) {// AJAX提交
            $data = is_array($ajax) ? $ajax : $extendData;
            $data['info'] = $message;
            $data['status'] = $status;
            $data['url'] = $jumpUrl;
            $this->ajaxReturn($data);
        }
        if (is_int($ajax))
            $this->assign('waitSecond', $ajax);
        if (!empty($jumpUrl))
            $this->assign('jumpUrl', $jumpUrl);
        // 提示标题
        $this->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'));
        //如果设置了关闭窗口，则提示完毕后自动关闭窗口
        if ($this->get('closeWin'))
            $this->assign('jumpUrl', 'javascript:window.close();');
        $this->assign('status', $status);   // 状态
        //保证输出不受静态缓存影响
        C('HTML_CACHE_ON', false);
        if ($status) { //发送成功信息
            $this->assign('message', $message); // 提示信息
            // 成功操作后默认停留1秒
            if (!isset($this->waitSecond))
                $this->assign('waitSecond', '1');
            // 默认操作成功自动返回操作前页面
            if (!isset($this->jumpUrl))
                $this->assign("jumpUrl", $_SERVER["HTTP_REFERER"]);
            $this->display(C('TMPL_ACTION_SUCCESS'));
        }else {
            $this->assign('error', $message); // 提示信息
            //发生错误时候默认停留3秒
            if (!isset($this->waitSecond))
                $this->assign('waitSecond', '3');
            // 默认发生错误的话自动返回上页
            if (!isset($this->jumpUrl))
                $this->assign('jumpUrl', "javascript:history.back(-1);");
            $this->display(C('TMPL_ACTION_ERROR'));
            // 中止执行  避免出错后继续执行
            exit;
        }
    }

}
